package ihm;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Iterator;
import javax.swing.JPanel;
import vision.ImageFacette;

/**
 * Zone de dessin de la scène à afficher.
 * <p>
 * IMPORTANT: vous devez compléter la redéfinition de "paintComponent" dans
 * cette classe, en fonction de vos propres classes.
 * <p>
 * Evenements captes par la zone de dessin:
 * <li>Rotation à la souris. Leur gestion est déleguée à un gestionnaire
 * externe.
 * <li>Translation via les flèches haut et bas.
 * <p>
 * Cette classe implémente l'interface Observateur, et s'enregistre auprès du
 * contrôleur (qui implement Observable). Ainsi, elle reçevra les signaux de
 * mise a jour envoyés par le contrôleur.
 */
@SuppressWarnings("serial")
class ZoneDessin extends JPanel implements Observateur {
	private ControleurApplication controleur;
	private GestionnaireSouris mickey;

	public ZoneDessin(ControleurApplication controleur) {
		this.controleur = controleur;
		setPreferredSize(new Dimension(controleur.getDimU(),
				controleur.getDimV()));
		mickey = new GestionnaireSouris(controleur);
		this.addMouseListener(mickey);
		// ecoute les signaux de maj du controleur
		this.controleur.ajouteObservateur(this);
	}

	/** Methode appelee suite a la notification de maj du controleur */
	@Override
	public void actualise() {
		repaint();
		// provoque le reaffichage du composant, avec au bout de
		// la chaine l'execution de paintComponent, redefinie ci-dessous
	}

	@Override
	public void paintComponent(Graphics g) {
		// super.paintComponent clears offscreen pixmap,
		// since we're using double buffering by default.
		super.paintComponent(g);

		// clean the screen: fill with a white rectangle
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, controleur.getDimU(), controleur.getDimV());
		// change referential: center of the screen
		g.translate(controleur.getDimU() / 2, controleur.getDimV() / 2);
		// Draw the face's images
		Iterator<ImageFacette> imgFctIt = controleur.modele.getImagesFacettes();
		int[] xpoints = new int[3];
		int[] ypoints = new int[3];
		// draw the polygon in blue
		/*while (imgFctIt.hasNext()) {
			ImageFacette imgFct = imgFctIt.next();
			xpoints = imgFct.getXPoints();
			ypoints = imgFct.getYPoints();
			g.setColor(Color.BLUE);
			g.fillPolygon(xpoints, ypoints, 3);
		}*/
		// draw the lines delimiting the polygon in black
		imgFctIt = controleur.modele.getImagesFacettes();
		while (imgFctIt.hasNext()) {
			ImageFacette imgFct = imgFctIt.next();
			xpoints = imgFct.getXPoints();
			ypoints = imgFct.getYPoints();
			g.setColor(Color.GRAY);
			g.drawPolygon(xpoints, ypoints, 3);
		}
	}
}
